#ifndef _FONTSETTINGS_H_
#define _FONTSETTINGS_H_

#define FMASK_WEIGHT                            0x000000FF
#define FWEIGHT_THIN                            0x00000002
#define FWEIGHT_NORMAL                          0x00000001
#define FWEIGHT_BOLD                            0x00000004

#define FMASK_STYLE                             0x0000FF00
#define FSTYLE_NORMAL                           0x00000100
#define FSTYLE_ITALIC                           0x00000200
#define FSTYLE_UNDERLINE                        0x00000400
#define FSTYLE_STRIKEOUT                        0x00000800

#define FMASK_SETTINGS                          0x00FF0000
#define FSETTING_QUALITY_LOW                    0x00010000
#define FSETTING_QUALITY_NORMAL                 0x00000000
#define FSETTING_QUALITY_HIGH                   0x00020000
#define FSETTING_KERNING_OFF                    0x00040000
#define FSETTING_GLYPH_MARK_NONEXISTING         0x00080000
#define FSETTING_WEIGHT_SENSITIVE               0x00100000

#define FMAP_UNKNOWN_SKIP                       0x00000001
#define FMAP_UNKNOWN_DEFAULT                    0x00000002

#define FUNICODE_BASIC                                           100
#define FUNICODE_I18N_GREEK                                      101
#define FUNICODE_I18N_CYRILLIC                                   102
#define FUNICODE_I18N_ARABIC                                     103
#define FUNICODE_I18N_HEBREW                                     104
#define FUNICODE_I18N_HIRAGANA                                   105
#define FUNICODE_I18N_KATAKANA                                   106

// 0x0000 - 0x0000
#define FUNICODE_BASIC_LATIN                                     1  // 0x0000 - 0x007F
#define FUNICODE_LATIN_SUPPLEMENT                                2  // 0x0080 - 0x00FF
#define FUNICODE_LATIN_EXTENDED_A                                3  // 0x0100 - 0x017F
#define FUNICODE_LATIN_EXTENDED_B                                4  // 0x0180 - 0x024F
#define FUNICODE_IPA_EXTENSIONS                                  5  // 0x0250 - 0x02AF
#define FUNICODE_SPACING_MODIFIER_LETTERS                        6  // 0x02B0 - 0x02FF
#define FUNICODE_COMBINING_DIACRITICAL_MARKS                     7  // 0x0300 - 0x036F
#define FUNICODE_GREEK_AND_COPTIC                                8  // 0x0370 - 0x03FF
#define FUNICODE_CYRILLIC                                        9  // 0x0400 - 0x04FF
#define FUNICODE_CYRILLIC_SUPPLEMENT                             10 // 0x0500 - 0x052F
#define FUNICODE_ARMENIAN                                        11 // 0x0530 - 0x058F
#define FUNICODE_HEBREW                                          12 // 0x0590 - 0x05FF
#define FUNICODE_ARABIC                                          13 // 0x0600 - 0x06FF
#define FUNICODE_SYRIAC                                          14 // 0x0700 - 0x074F
#define FUNICODE_ARABIC_SUPPLEMENT                               15 // 0x0750 - 0x077F
#define FUNICODE_THAANA                                          16 // 0x0780 - 0x07BF
#define FUNICODE_NKO                                             17 // 0x07C0 - 0x07FF
#define FUNICODE_SAMARITAN                                       18 // 0x0800 - 0x083F
#define FUNICODE_MANDAIC                                         19 // 0x0840 - 0x085F
#define FUNICODE_ARABIC_EXTENDED_A                               20 // 0x08A0 - 0x08FF
#define FUNICODE_INDIC_DEVANAGARI                                21 // 0x0900 - 0x097F
#define FUNICODE_INDIC_BENGALI                                   22 // 0x0980 - 0x09FF
#define FUNICODE_INDIC_GURMUKHI                                  23 // 0x0A00 - 0x0A7F
#define FUNICODE_INDIC_GUJARATI                                  24 // 0x0A80 - 0x0AFF
#define FUNICODE_INDIC_ORIYA                                     25 // 0x0B00 - 0x0B7F
#define FUNICODE_INDIC_TAMIL                                     26 // 0x0B80 - 0x0BFF
#define FUNICODE_INDIC_TELUGU                                    27 // 0x0C00 - 0x0C7F
#define FUNICODE_INDIC_KANNADA                                   28 // 0x0C80 - 0x0CFF
#define FUNICODE_INDIC_MALAYALAM                                 29 // 0x0D00 - 0x0D7F
#define FUNICODE_INDIC_SINHALA                                   30 // 0x0D80 - 0x0DFF
#define FUNICODE_THAI                                            31 // 0x0E00 - 0x0E7F
#define FUNICODE_LAO                                             32 // 0x0E80 - 0x0EFF
#define FUNICODE_TIBETAN                                         33 // 0x0F00 - 0x0FFF
#define FUNICODE_MYANMAR                                         34 // 0x1000 - 0x109F
#define FUNICODE_GEORGIAN                                        35 // 0x10A0 - 0x10FF
#define FUNICODE_HANGUL_JAMO                                     36 // 0x1100 - 0x11FF
#define FUNICODE_ETHIOPIC                                        37 // 0x1200 - 0x137F
#define FUNICODE_ETHIOPIC_SUPPLEMENT                             38 // 0x1380 - 0x139F
#define FUNICODE_CHEROKEE                                        39 // 0x13A0 - 0x13FF
#define FUNICODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS           40 // 0x1400 - 0x167F
#define FUNICODE_OGHAM                                           41 // 0x1680 - 0x169F
#define FUNICODE_RUNIC                                           42 // 0x16A0 - 0x16FF
#define FUNICODE_PHILIPPINE_TAGALOG                              43 // 0x1700 - 0x171F
#define FUNICODE_PHILIPPINE_HANUNOO                              44 // 0x1720 - 0x173F
#define FUNICODE_PHILIPPINE_BUHID                                45 // 0x1740 - 0x175F
#define FUNICODE_PHILIPPINE_TAGBANWA                             46 // 0x1760 - 0x177F
#define FUNICODE_KHMER                                           47 // 0x1780 - 0x17FF
#define FUNICODE_MONGOLIAN                                       48 // 0x1800 - 0x18AF
#define FUNICODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED  49 // 0x18B0 - 0x18FF
#define FUNICODE_LIMBU                                           50 // 0x1900 - 0x194F
#define FUNICODE_TAI_LE                                          51 // 0x1950 - 0x197F
#define FUNICODE_TAI_LUE                                         52 // 0x1980 - 0x19DF
#define FUNICODE_KHMER_SYMBOLS                                   53 // 0x19E0 - 0x19FF
#define FUNICODE_BUGINESE                                        54 // 0x1A00 - 0x1A1F
#define FUNICODE_TAI_THAM                                        55 // 0x1A20 - 0x1AAF
#define FUNICODE_PHONETIC_EXTENSIONS                      113 //
#define FUNICODE_PHONETIC_EXTENSIONS_SUPPLEMENT           114
#define FUNICODE_COMBING_DIACRITICAL_MARKS_SUPPLEMENT     115
#define FUNICODE_LATIN_EXTENDED_ADDITIONAL                116
#define FUNICODE_GREEK_EXTENDED                           117
#define FUNICODE_GENERAL_PUNCTUATION                      118
#define FUNICODE_SUBSCRIPTS_AND_SUPERSCRIPTS              119
#define FUNICODE_CURRENCY_SYMBOLS                         120
#define FUNICODE_COMBING_DIACRITICAL_MARKS_FOR_SYMBOLS    21
#define FUNICODE_LETTERLIKE_SYMBOLS                       22
#define FUNICODE_NUMBER_FORMS                             23
#define FUNICODE_ARROWS                                   24
#define FUNICODE_MATHEMATICAL_OPERATORS                   25
#define FUNICODE_MISCELLANEOUS_TECHNICAL                  26
#define FUNICODE_BOX_DRAWING                              27
#define FUNICODE_BLOCK_ELEMENTS                           28
#define FUNICODE_MISCELLANEOUS_SYMBOLS                    29
#define FUNICODE_LATIN_EXTENDED_C                         30
#define FUNICODE_MODIFIER_TONE_LETTERS					  31
#define FUNICODE_LATIN_EXTENDED_D                         32
#define FUNICODE_ARABIC_PRESENTATION_FORMS_A_1            33
#define FUNICODE_ARABIC_PRESENTATION_FORMS_A_2            34
#define FUNICODE_ARABIC_PRESENTATION_FORMS_A_3            35
#define FUNICODE_COMBINING_HALF_MARKS                     36
#define FUNICODE_ARABIC_PRESENTATION_FORMS_B              37
#define FUNICODE_SPECIALS                                 38
#define FUNICODE_MUSICAL_SYMBOLS                          39
#define FUNICODE_TAGS                                     40

namespace Font
{

	struct Style
	{

		enum List
		{
			eNormal,
			eItalic,
			iTotal
		};

	}; // struct Style

	struct Weight
	{

		enum List
		{
			eNormal,
			eBold,
			iTotal
		};

	}; // struct Weight

	struct Line
	{

		enum List
		{
			eNormal,
			eUnderline,
			eOverline,
			eStrikeThrough,
			iTotal
		};

	}; // struct Line

	struct Instruction
	{
	
		enum List
		{
			eCodePoint,
			eNewLine,
			eTab,
			eEndOfData,
			iTotal
		};
	
	}; // struct Instruction

	typedef void (*LogFunc)(int a_Severity, const char* a_Message, const char* a_Time, const char* a_CodeFile, int a_CodeLine);

	class GlyphPage;
	class Text;

	typedef GlyphPage* (*TextureFactoryFunc)(unsigned int a_Width, unsigned int a_Height, GLubyte* a_Data);
	typedef Text* (*DisplayListFactoryFunc)(GlyphPage* a_Texture, unsigned int a_VertexCount);

}; // namespace Rpt

#endif